/***************************************************
 ** Create by Hasaki on 2021/11/25.
 ** This file is part of the CSTL project.
 ** This file follows version 3 of GNU License.
 ** About GNU, see <https://www.gnu.org/licenses/>.
 **
 ** 本文件由Hasaki(间宫羽咲sama)于2021年11月25日创建。
 ** 本文件是CSTL(C-STL)项目的一部分。
 ** 本文件遵从GNU-v3协议。
 ** 关于GNU协议，见<https://www.gnu.org/licenses/>。
 ***************************************************/
#ifndef HASAKI_LOG_CONFIG_H
#define HASAKI_LOG_CONFIG_H   // HskLogConfig.h

#include <stdio.h>            // To include printf

#define HASAKI_LOG_ENABLE_CRITICAL_WARNING   1 // 显示Critical Warning信息，如空间不足
#define HASAKI_LOG_ENABLE_PARAMETER_WARNING  1 // 显示Parameter Warning信息，如输入参数并非期望的
#define HASAKI_LOG_ENABLE_NULLPTR_WARNING    1 // 如果传的this参数是NULL，开启该警告将报错，方便debug。关闭该警告减少if语句，提高程序运行效率
#define HASAKI_LOG_ENABLE_WARNING            1 // 显示Warning信息，如一些语义正确，但可能误用的操作
#define HASAKI_LOG_ENABLE_DEBUG              0 // 显示Debug信息，默认关闭

// Critical Warning选项
#if HASAKI_LOG_ENABLE_CRITICAL_WARNING == 0
  #define HSK_LOG_CRIT_WARN(args) 
#else
  #define HSK_LOG_CRIT_WARN(args) args
#endif

// 一般用于检查分配空间是否
// 相当于assert(_vec != NULL)，不满足执行dosomethings警告并直接返回rtval（传空格代表返回void）
// 可以通过将HASAKI_LOG_ENABLE_CRITICAL_WARNING置0禁用dosomethings，但不会禁用return语句
#define ASSERT_MALLOC_NOT_NULL(_vec, dosomethings, rtval) \
if ((_vec) == NULL) {\
  HSK_LOG_CRIT_WARN(\
    dosomethings;\
  )\
  return rtval;\
}

// Parameter Warning选项
#if HASAKI_LOG_ENABLE_PARAMETER_WARNING == 0
  #define HSK_LOG_PARM_WARN(args) 
#else
  #define HSK_LOG_PARM_WARN(args) args
#endif

// NullPtr Warning选项
#if HASAKI_LOG_ENABLE_NULLPTR_WARNING == 0
  #define HSK_LOG_NULL_WARN(args) 
#else
  #define HSK_LOG_NULL_WARN(args) args
#endif

// 相当于assert(_this != NULL)，不满足输出funName警告后执行dosomethings返回rtval（传空格代表返回void）
// 可以通过将HASAKI_LOG_ENABLE_NULLPTR_WARNING置0禁用该语句的编译，提高程序运行效率
#define ASSERT_THIS_NOT_NULL(_this, funName, dosomethings, rtval) \
HSK_LOG_NULL_WARN(\
  if ((_this) == NULL) {\
    printf("[" funName " NULL WARN]: ATTENTION! pointer _this == NULL, already return.\n");\
    dosomethings;\
    return rtval;\
  }\
)

// Warning选项
#if HASAKI_LOG_ENABLE_WARNING == 0
  #define HSK_LOG_WARN(args) 
#else
  #define HSK_LOG_WARN(args) args
#endif

// Debug选项
#if HASAKI_LOG_ENABLE_DEBUG == 0
  #define HSK_LOG_DEBUG(args) 
#else
  #define HSK_LOG_DEBUG(args) args
#endif

#endif  // HskLogConfig.h
